<?php

class Security {
    private static $blockedIPs = [];

    // 加载已封禁的IP地址
    public static function loadBlockedIPs() {
        if (file_exists('blockip.txt')) {
            self::$blockedIPs = file('blockip.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        }
    }

    // 保存被封禁的IP地址
    private static function saveBlockedIPs() {
        file_put_contents('blockip.txt', implode(PHP_EOL, self::$blockedIPs));
    }

    // 过滤SQL注入
    public static function filterSqlInjection($input) {
        // 使用PDO预处理语句是防止SQL注入的最佳实践
        // 此处简单检查一些常见的SQL注入模式（仅作为示例）
        $pattern = '/(\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|GRANT|EXEC|CREATE|ALTER|TRUNCATE)\b)/i';
        if (preg_match($pattern, $input)) {
            self::blockIp();
        }
        // 简单的转义（实际应用中应使用PDO或MySQLi的预处理语句）
        return mysqli_real_escape_string($input); // 注意：这里假设已经创建了数据库连接
    }

    // 过滤XSS攻击
    public static function filterXss($input) {
        // 使用htmlspecialchars来转义HTML标签
        $output = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
        // 进一步过滤常见的JavaScript事件属性
        $pattern = '/<[^>]+(onblur|onchange|onclick|onfocus|onload|onmouseover|onmouseup|onmouseout|onmousedown|onselect|onsubmit|onkeydown|onkeyup|onkeypress|onresize|onerror)=[^>]*>/i';
        if (preg_match($pattern, $input)) {
            self::blockIp();
        }
        return $output;
    }

    // 封禁当前IP并记录
    private static function blockIp() {
        $ip = $_SERVER['REMOTE_ADDR'];
        if (!in_array($ip, self::$blockedIPs)) {
            self::$blockedIPs[] = $ip;
            self::saveBlockedIPs();
            exit("Your IP is blocked.");
        } else {
            exit("Access Denied.");
        }
    }
}

// 使用示例
Security::loadBlockedIPs();

// 假设用户输入的数据
$userInputSql = "<script>alert('XSS');</script> OR '1'='1";
$userInputXss = "<img src='x' onerror='alert(\"XSS\")'>";

// 过滤SQL注入
$safeSqlInput = Security::filterSqlInjection($userInputSql);

// 过滤XSS攻击
$safeXssInput = Security::filterXss($userInputXss);

// 注意：实际使用中，安全处理应该结合数据库预处理语句、输出编码等最佳实践
// 这里仅作为示例说明如何构建安全类和过滤方法
?>